メインコンテンツまでスキップ

機体 3Dモデル・同期設定

警告

この節を始める前に、(ワールドの設定)を必ず終わらせてください。

チェックリスト

  • Packages/FDMi - Example/Prefabsから機体のテンプレート (PlaneTemplate.FDMi、またはEarly_Jet_1.FDMi)を用意する
  • PlaneTemplate.FDMi/DataBus/Vehicle/Model/に機体の3Dモデルが入っている
  • Databus/Vehicle/NotInZone/EnterZone
    • コライダー
      • 位置・大きさが正しいか?
      • "Is Trigger" ⇒ ☑
    • RelativeSyncPositionTriggerの設定
      • "Detect Enter" ⇒ ☑ (有効)
      • "Detect Exit" ⇒ ☐ (無効)
    • Databus/Vehicle/NotInZone/
      • On When Disable  ⇒ ☑ (有効)
  • Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZoneの設定
    • コライダー
      • 位置・大きさが正しいか?
      • "Is Trigger" ⇒ ☑
    • RelativeSyncPositionTriggerの設定
      • "Detect Enter" ⇒ ☐ (無効)
      • "Detect Exit" ⇒ ☑ (有効)
    • Databus/Vehicle/OnlyIsRoot/OnlyInZone/
      • On When Disable  ⇒ ☐ (無効)
  • Databus/Vechicle/Colliders以下に、機体の外形コライダーを設置
  • 椅子の設定(PilotSeat)
    • 配置を設定します。コライダーの判定を、Box Colliderを調節して修正
    • Box ColliderIs Trigger ⇒ ☑ (有効) -Databus/Vechicle/Model/SeatManager/PilotSeat/Seatの位置を椅子の座面あたりに設定
    • Databus/Vechicle/Model/SeatManager/PilotSeat/Exitの位置を、降りるときの位置に設定
    • Databus/Vechicle/Model/SeatManager/PilotSeat/OnlyInSeat/ExitButtonの位置を調整
  • FDMi/Setup All FDMi Componentsを押す。

1.3Dモデルの配置

まず、機体の3Dモデルを配置します。 このとき、下図の様に機体の脚が静止時の状態(タイヤがすべて水平な地面に接地した状態)を作成してください。

機体の配置

次に、プロジェクト内の Packages/FDMi - Example/Prefabs にある Prefab PlaneTemplate.FDMiを、モデルの子に入れます。 そのうえで

  • TransformのPositionをすべて0にします
  • TransformのRotationを以下のように調節します。
    • X軸(赤)を、機体の右手側
    • Y軸(緑)を、水平な地面に垂直
    • Z軸(青)を機体正面

PlaneTemplate.FDMiの配置とXYZ軸の調整

ここで、一度 PlaneTemplate.FDMiを、3Dモデルの外に出します。このとき、PlaneTemplate.FDMiのRotationのX軸が0以外の場合、0を代入してください。 そのうえで、3Dモデルを PlaneTemplate.FDMi/DataBus/Vehicle/Model/の子にいれます。

警告

PlaneTemplate.FDMiを含む、飛行機の親GameObjectは、シーンの一番上の階層に配置してください。
飛行機の親GameObjectとは、FDMiObjectManagerを含むGameObjectを指します。

PlaneTemplate.FDMiと3DモデルのTransform親子関係変更

ここまでできましたら、この時点で一度Prefab Variantを作成することを推奨します。 まず、PlaneTemplate.FDMiの名称を変更します。今回はEarly_Jet_1.FDMiとします。 適切なフォルダ(通常 /Assets以下)にドラッグアンドドロップします。 このとき、選択肢が現れますので、Original Prefab または Prefab Variant を選択してください。

plane_inst_4

注記

基本的にはFDMiのバージョン更新による不特定な仕様変化を避けるため、Original Prefabをお勧めします。
本チュートリアルではPrefab Variantで設定を進めます。

2. 同期の設定

機体の位置の同期は Databus/Sync が行います。これは後程でてくるSetup All FDMi Componentsで自動設定されますので、放っておいてください。

備考

FDMiにおける同期の仕組みを簡単に説明します。(読み飛ばしてかまいません)

  • 飛行機の外にいるときは、普通のVRChatワールドとほぼ同じ感じです。
  • 飛行機の中に入る(もしくは飛行機の椅子に座る)と、Unity上の原点に飛行機を固定し、地面が動くようになります。
  • 飛行機の外に出ると、元の状態に戻ります。

これらの”原点の管理”は Databus/Syncで行われています。 FDMiは、DataBus/Syncを含むFDMiReferencePointが、Transformを動的に組み替え、原点の位置を常にLocalPlayerの近くに移動させます。 これにより、地球程度の大きさであれば、自由に移動ができます。

さて、FDMiでは同期を含む様々な挙動に 「機体内にLocalPlayerが入った・機体からLocalPlayerが出た」判定が重要になります。
その判定にはRelativeSyncPositionTriggerを使用します。

RelativeSyncPositionTriggerは、今回二か所にあります。

  • Databus/Vehicle/NotInZone/EnterZone
  • Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZone

それぞれについて見ていきます

2.1 Databus/Vehicle/NotInZone/EnterZone(機内に"入る")

Databus/Vehicle/NotInZone/EnterZoneを見ていきます。

plane_inst_5

PlaneTemplate.FDMiから機体を制作している場合、まずコライダーの位置がずれているはずです。いい感じに修正してください。(Transformを動かしてかまいません。) 今回のような単座機では、判定は極小でかまいません。(逆に旅客機や爆撃機の場合、大き目にとると良いでしょう)。

更に、Databus/Vehicle/NotInZone/EnterZoneのコライダー "Is Trigger" が ☑ になっていることを確認して下さい。

ヒント

Box ColliderのComponentの中身が見えないときは、一度ほかのGameObjectを選択後、再度Databus/Vehicle/NotInZone/EnterZoneを選択してください。

次に、RelativeSyncPositionTriggerの設定を確認して下さい

  • "Detect Enter" ⇒ ☑ (有効)
  • "Detect Exit" ⇒ ☐ (無効)

次に、一つ上の階層、Databus/Vehicle/NotInZone/にあるFDMiObjectActivateInZoneついて、以下の設定を確認してください。

  • On When Disable  ⇒ ☑ (有効)

plane_inst_6

ヒント

PlaneTemplate.FDMiから機体を制作している場合、InZoneの項目は設定されていませんが、後から自動で設定されます。

備考

RelativeSyncPositionTriggerは、OnTriggerEnter/OnTriggerExitにより、Box Colliderからの出入りを取得します。 Detect Enterが☑(有効)なときは、以下のような動作を行います。

  • ワールドの原点を飛行機中心にする
  • InZone = true を設定する。
    • InZoneが自身の変更を検知し、あらかじめ登録されたGameObjectを呼び出す。
      • InZoneは”LocalPlayerが機内にいる”状態を示す。

また、FDMiObjectActivateInZoneは、InZoneの情報を基に、自身のGameObjectを入切します。 これにより、”飛行機の中にいるときのみ見える/動く”と”飛行機の外にいるときのみ見える/動く”を実現しています。

2.2 Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZone

2.1と同様に、今度は”機体から出た”を検出するコライダーを作ります。Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZoneを見ていきます。

まずコライダーの位置をいい感じに修正してください。(Transformを動かしてかまいません。) ExitZoneでは、必ず判定を、機内の椅子・歩ける箇所を全て含む、大きな囲いで囲ってください。

更に、Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZoneのコライダー "Is Trigger" が ☑ になっていることを確認して下さい。

次に、RelativeSyncPositionTriggerの設定を確認して下さい。
※ 2.1と反対のセッティングです!

  • "Detect Enter" ⇒ ☐ (無効)
  • "Detect Exit" ⇒ ☑ (有効)

次に、一つ上の階層、Databus/Vehicle/OnlyIsRoot/OnlyInZoneにあるFDMiObjectActivateInZoneついて、以下の設定を確認してください。

  • On When Disable  ⇒ ☐ (無効)
備考

Databus/Vehicle/OnlyIsRootにあるFDMiRelativeSyncOnlyIsRootは、機内にいるとき、ワールドの中心に機体を固定するために使用されます。 Databus/Vehicle/OnlyIsRootの直下には、OnlyInZone以外を入れないでください。

スクリプト実行時、Databus/Vehicle/ModelにあるFDMiRelativeSyncModelTransformFDMiRelativeSyncOnlyIsRootは協調して動作します。

  • Start()のタイミングで、FDMiRelativeSyncOnlyIsRootは自身をDatabus/Vehicleの外に出し、ワールド原点に固定します。
  • InZone=trueになると、FDMiRelativeSyncModelTransformは自身をFDMiRelativeSyncOnlyIsRootの子に設定します。
  • InZone=falseになると、FDMiRelativeSyncModelTransformは自身をDatabus/Vehicleの子に設定します。

機内にものを配置したいときは、Databus/Vehicle/Model以下に置くことをお勧めします。

2.3 機内の床コライダー

ここで、Databus/Vehicle/OnlyIsRoot/OnlyInZone/FloorColliderをみてみます。 先程のOnlyInZoneの機能を用い、機内だけで見える床を設定します。 機内で、人を立たせたい位置にコライダーを配置してください。

ヒント

Databus/Vehicle/OnlyIsRoot/OnlyInZone/FloorColliderのLayerは"BoardingCollider"に設定します。
設定されていない場合、Unityの上部メニュー "FDMi/Setup/Setup Layer"をクリックしてください。

ヒント

FDMi機は、InZoneの判定にあれば、制限なく何人でも乗れてしまいます。 ゲーム性に問題が生じる場合、床コライダー自体を消してしまいましょう。

2.4 機体外形コライダー

2.3は”機内”のときだけ有効になるコライダーです。機外の、機体同士の当たり判定などは、Databus/Vechicle/Colliders以下にコライダーを配置して設定してください。 LayerはWalkThroughを推奨します。

3. 椅子の配置

次に、機内で座れる”椅子”を配置します。 Databus/Vechicle/Model/SeatManager/PilotSeatを見てください。

  • 配置を設定します。コライダーの判定を、Box Colliderを調節して修正してください。
  • Box ColliderIs Trigger ⇒ ☑ (有効)
  • 座る位置を設定します。Databus/Vechicle/Model/SeatManager/PilotSeat/Seatの位置を、座面あたりに設定します。
  • 降りる際の位置を設定します。Databus/Vechicle/Model/SeatManager/PilotSeat/Exitの位置を、降りるときの位置に設定します。
  • 椅子から降りるボタンを設定します。Databus/Vechicle/Model/SeatManager/PilotSeat/OnlyInSeat/ExitButtonの位置を調整します。

ヒント

パイロット以外の椅子を増やしたいときは、Databus/Vechicle/Model/SeatManager以下にPilotSeatをコピーしてください。
その際、OnlyInSeat以下のInputの項目は、必ずメンテナンスしてください。

4. Setup All FDMi Components

ここまでの設定が終わったら、上部メニューのFDMi/Setup All FDMi Componentsを押します。 自動でワールド・機体の設定を行います。

上手くいけたら、DataBus/Data以下にたくさんのGameObjectが生成されているはずです。これらは、自動生成されたFDMiDataです。
DataBus/Dataの中にはInZoneもあるはずです。2.2で説明したInZoneがあります。
試しに、Databus/Vehicle/NotInZoneInZone項目を空にした後、FDMi/Setup All FDMi Componentsを押してみてください。
自動でInZoneが割り振られているはずです。

Setup All FDMi Componentsは、可能な限り自動で設定を行います。 以下の場合は一度押してください。

  • 新しく機体等を配置したとき。もしくは設定を変更したとき。
  • 機体が上手く動かないとき